import pymysql

# 1. 数据库配置
DBCONFIG = {
    'host': 'localhost',
    'database': 'mcmod',
    'user': 'root',
    'password': '123456',
    'charset': 'utf8mb4',
    # 增加 cursorclass，让查询结果直接返回为字典
    'cursorclass': pymysql.cursors.DictCursor
}


def create_table():
    """
    检查并创建 mod列表 表。
    如果表已存在，则不执行任何操作。
    """
    conn = None
    cursor = None
    try:
        conn = pymysql.connect(**DBCONFIG)
        cursor = conn.cursor()

        sql = """
              CREATE TABLE IF NOT EXISTS mod列表 \
              ( \
                  modID \
                  INT \
                  PRIMARY \
                  KEY, \
                  mod名称 \
                  VARCHAR \
              ( \
                  255 \
              ) NOT NULL,
                  mod标签 TEXT,
                  mod浏览量 INT,
                  mod封面 VARCHAR \
              ( \
                  512 \
              ),
                  红票 INT,
                  黑票 INT
                  ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; \
              """
        cursor.execute(sql)
        conn.commit()
        print("[数据库] 'mod列表' 表检查/创建成功。")

    except Exception as e:
        print(f"[数据库] 创建 'mod列表' 表时出错: {e}")
        if conn:
            conn.rollback()
    finally:
        if cursor:
            cursor.close()
        if conn:
            conn.close()


def insert_mod_info(mod_info):
    """
    向 mod列表 表中插入或更新一条模组信息。
    使用 ON DUPLICATE KEY UPDATE 实现如果 modID 存在则更新，否则插入。
    """
    conn = None
    cursor = None
    try:
        conn = pymysql.connect(**DBCONFIG)
        cursor = conn.cursor()

        sql = """
              INSERT INTO mod列表 (modID, mod名称, mod标签, mod浏览量, mod封面, 红票, 黑票)
              VALUES (%(modID)s, %(mod名称) s, %(mod标签) s, %(mod浏览量) s, %(mod封面) s, %(红票) s, %(黑票) \
                      s) ON DUPLICATE KEY \
              UPDATE \
                  mod名称 = \
              VALUES (mod名称), mod标签 = \
              VALUES (mod标签), mod浏览量 = \
              VALUES (mod浏览量), mod封面 = \
              VALUES (mod封面), 红票 = \
              VALUES (红票), 黑票 = \
              VALUES (黑票); \
              """
        cursor.execute(sql, mod_info)
        conn.commit()
        return True

    except Exception as e:
        print(f"[数据库] 插入/更新 'mod列表' 失败: {e}")
        if conn:
            conn.rollback()
        return False
    finally:
        if cursor:
            cursor.close()
        if conn:
            conn.close()


def insert_mod_type(mod_info):
    """
    向 mod类型表 中插入或更新一条模组类型信息。
    表结构: (mod名称 VARCHAR(255) PRIMARY KEY, mod标签 TEXT)
    """
    conn = None
    cursor = None
    try:
        conn = pymysql.connect(**DBCONFIG)
        cursor = conn.cursor()

        # 准备只包含 mod名称 和 mod标签 的数据
        type_data = {
            'mod名称': mod_info['mod名称'],
            'mod标签': mod_info['mod标签']
        }

        sql = """
              INSERT INTO mod类型 (mod名称, mod标签)
              VALUES (%(mod名称) s, %(mod标签) s) ON DUPLICATE KEY \
              UPDATE \
                  mod标签 = \
              VALUES (mod标签); \
              """
        cursor.execute(sql, type_data)
        conn.commit()
        return True

    except Exception as e:
        print(f"[数据库] 插入/更新 'mod类型表' 失败: {e}")
        if conn:
            conn.rollback()
        return False
    finally:
        if cursor:
            cursor.close()
        if conn:
            conn.close()


def insert_mod_popularity(mod_info):
    conn = None
    cursor = None
    try:
        conn = pymysql.connect(**DBCONFIG)
        cursor = conn.cursor()

        # 准备只包含 mod名称 和 mod浏览量 的数据
        popularity_data = {
            'mod名称': mod_info['mod名称'],
            'mod浏览量': mod_info['mod浏览量']
        }

        try:
            popularity_data['mod浏览量'] = int(popularity_data['mod浏览量'])
        except (ValueError, TypeError):
            popularity_data['mod浏览量'] = 0

        sql = """
              INSERT INTO mod热度 (mod名称, mod浏览量)
              VALUES (%(mod名称) s, %(mod浏览量) s) ON DUPLICATE KEY \
              UPDATE \
                  mod浏览量 = \
              VALUES (mod浏览量); \
              """
        cursor.execute(sql, popularity_data)
        conn.commit()
        return True

    except Exception as e:
        print(f"[数据库] 插入/更新 'mod热度表' 失败: {e}")
        if conn:
            conn.rollback()
        return False
    finally:
        if cursor:
            cursor.close()
        if conn:
            conn.close()


def fetch_all_mods():
    """
    从 mod列表 表中查询所有数据。
    """
    conn = None
    cursor = None
    try:
        conn = pymysql.connect(**DBCONFIG)
        cursor = conn.cursor()

        sql = "SELECT * FROM mod列表"
        cursor.execute(sql)
        results = cursor.fetchall()
        return results

    except Exception as e:
        print(f"[数据库] 查询 'mod列表' 数据失败: {e}")
        return []
    finally:
        if cursor:
            cursor.close()
        if conn:
            conn.close()


if __name__ == '__main__':
    print("--- 正在测试数据库连接和表结构 ---")
    create_table()

    print("\n--- 正在查询所有数据 ---")
    all_mods_data = fetch_all_mods()

    if all_mods_data:
        import pandas as pd

        df = pd.DataFrame(all_mods_data)
        print("\n--- 当前数据库 'mod列表' 中的所有模组 ---")
        print(df.to_string())
    else:
        print("\n数据库 'mod列表' 中没有数据，或者查询失败。")

